package model

import (
	"fmt"
	"gitee.com/liumou_site/logger"
	"os"
	"strings"
)

// CheckConfig 检查登录配置是否有效。
// 该函数会验证配置文件中域名、子域名、密钥对ID、密钥对SecretKey、备注信息以及解析记录类型等字段是否已正确设置。
// 如果发现任何字段未设置或设置不正确，函数会输出错误信息并终止程序。
func (l *Login) CheckConfig() {
	if len(os.Getenv("DOMAIN")) >= 3 {
		l.Domain.Domain.Domain = os.Getenv("DOMAIN")
		if l.Debug {
			logger.Debug("使用环境变量DOMAIN: ", os.Getenv("DOMAIN"))
		}
	}
	if len(os.Getenv("Sub4")) >= 1 {
		l.Domain.Domain.Sub4 = os.Getenv("Sub4")
		if l.Debug {
			logger.Debug("使用环境变量Sub4: ", os.Getenv("Sub4"))
		}
	}
	if len(os.Getenv("Sub6")) >= 1 {
		l.Domain.Domain.Sub6 = os.Getenv("Sub6")
		if l.Debug {
			logger.Debug("使用环境变量Sub6: ", os.Getenv("Sub6"))
		}
	}
	if os.Getenv("TXY_KEY") != "" && len(os.Getenv("TXY_KEY")) >= 10 {
		l.Domain.Login.Key = os.Getenv("TXY_KEY")
		if l.Debug {
			logger.Debug("使用环境变量TXY_KEY: ", os.Getenv("TXY_KEY"))
		}
	}
	if os.Getenv("TXY_ID") != "" && len(os.Getenv("TXY_ID")) >= 10 {
		l.Domain.Login.Id = os.Getenv("TXY_ID")
		if l.Debug {
			logger.Debug("使用环境变量TXY_ID: ", os.Getenv("TXY_ID"))
		}
	}
	if os.Getenv("Remark") != "" && len(os.Getenv("Remark")) >= 10 {
		l.Domain.Domain.Remark = os.Getenv("Remark")
		if l.Debug {
			logger.Debug("使用环境变量 Remark: ", os.Getenv("Remark"))
		}
	}
	if os.Getenv("Type") != "" && len(os.Getenv("Type")) >= 10 {
		l.Domain.Domain.Type = os.Getenv("Type")
		if l.Debug {
			logger.Debug("使用环境变量 Type: ", os.Getenv("Type"))
		}
	}
	// 检查域名是否有效，域名长度应大于3
	if len(l.Domain.Domain.Domain) <= 3 {
		fmt.Println(l.Domain)
		logger.Error("请先编辑配置文件: ", l.ConfigFile)
		logger.Warn("或者设置环境变量 DOMAIN")
		fmt.Println("当前错误是设置域名的值，例如：example.com")
		os.Exit(3)
	}

	// 检查子域名是否有效，子域名不能为空
	if len(l.Domain.Domain.Sub4) == 0 && len(l.Domain.Domain.Sub6) == 0 {
		logger.Error("请先编辑配置文件: ", l.ConfigFile)
		logger.Warn("或者设置环境变量 Sub4 / Sub6")
		fmt.Println("当前错误是设置Sub4或者Sub6的值，请先设置一个值,例如：www")
		os.Exit(3)
	}

	// 检查密钥对的SecretKey是否有效，SecretKey不能为空

	if len(l.Domain.Login.Key) == 0 {
		fmt.Println(l.Domain.Login.Key)
		fmt.Println(l.Domain.Login)
		logger.Error("请先编辑配置文件: ", l.ConfigFile)
		logger.Warn("或者设置环境变量 TXY_KEY")
		fmt.Println("当前错误是密钥对的 TXY_KEY 值，用于登录腾讯云,可从下面的链接创建/获取")
		fmt.Println("https://console.cloud.tencent.com/cam/capi")
		os.Exit(3)
	}

	// 检查密钥对的ID是否有效，ID长度应大于10
	if len(l.Domain.Login.Id) <= 10 {
		fmt.Println(l.Domain.Login.Id)
		logger.Debug(len(l.Domain.Login.Id))
		fmt.Println(l.Domain.Login)
		logger.Warn("请先编辑配置文件: ", l.ConfigFile)
		logger.Warn("或者设置环境变量 TXY_ID")
		fmt.Println("当前错误是 TXY_ID 值，用于登录腾讯云,可从下面的链接创建/获取")
		fmt.Println("https://console.cloud.tencent.com/cam/capi")
		os.Exit(3)
	}

	// 检查备注信息是否有效，备注信息不能为空
	if l.Domain.Domain.Remark == "" {
		fmt.Println(l.Domain.Domain.Remark)
		logger.Error("请先编辑配置文件: ", l.ConfigFile)
		logger.Warn("或者设置环境变量 Remark")
		fmt.Println("当前错误是用于记录解析记录的备注信息，例如：家里的主机")
		os.Exit(3)
	}

	// 检查解析记录类型是否有效，类型应为"A"、"AAAA"或"ALL"
	Type := l.Domain.Domain.Type
	if strings.EqualFold(Type, "A") || strings.EqualFold(Type, "AAAA") || strings.EqualFold(Type, "ALL") {
		l.Err = nil
		return
	} else {
		fmt.Println(Type)
		logger.Error("请先编辑配置文件: ", l.ConfigFile)
		logger.Warn("或者设置环境变量 Type")
		fmt.Println("A: 设置此值则解析到IPV4地址")
		fmt.Println("AAAA: 设置此值则解析到IPV6地址")
		fmt.Println("ALL: 双栈地址解析")
		os.Exit(3)
	}
}

// CheckNameIsExist 检查给定的子名称是否存在于登录对象的子列表中。
// 该函数通过遍历子列表，并使用不区分大小写的比较来判断是否存在匹配项。
//
// 参数:
//   - sub: 需要检查的子名称。
//
// 返回值:
//   - bool: 如果子名称存在于子列表中，则返回 true；否则返回 false。
func (l *Login) CheckNameIsExist(sub string) bool {
	err := l.GetParseList()
	if err != nil {
		logger.Error("获取解析列表失败: ", err)
		return false
	}
	// 遍历子列表，检查是否存在与 sub 匹配的项
	for _, v := range l.SubList {
		if strings.EqualFold(v, sub) {
			return true
		}
	}
	return false
}
